# coding: utf-8

import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erfc


def ber_16qam_theoretical(snr_db):
    """
    计算 16QAM 在 AWGN 信道下的理论 BER (Gray 编码)

    参数：
        snr_db : float 或 np.ndarray
            信噪比，单位 dB
    返回：
        ber : float 或 np.ndarray
            对应的理论比特错误率
    """
    snr_linear = 10 ** (snr_db / 10)
    ber = (3 / 8) * erfc(np.sqrt(0.1 * snr_linear / 5))
    return ber


# ✅ 测试：SNR = 0 ~ 25 dB
snr_range = np.arange(-5, 26, 1)
ber_values = ber_16qam_theoretical(snr_range)

# 打印部分结果
# for s, b in zip(snr_range[::5], ber_values[::5]):
#     print(f"SNR={s:2d} dB -> BER={b:.4e}")
plt.figure()
plt.title("16-QAM Theoretical BER")
plt.ylabel("BER")
plt.xlabel("SNR(dB)")
plt.plot(snr_range, ber_values, "ro-")
plt.show()
